import mongoose from 'mongoose';
import BaseModel from './base_model';

const Schema = mongoose.Schema;
const ObjectId = Schema.ObjectId;

import _ from 'lodash';
import utility from 'utility';
import * as CONSTANTS from '../common/constants';

const UserSchema = new Schema({
  appId:               { type: String, requried: true },
  name:                { type: String },
  loginname:           { type: String, required: true },
  pass:                { type: String, required: true },
  email:               { type: String },
  url:                 { type: String },
  profile_image_url:   { type: String },
  location:            { type: String },
  signature:           { type: String },
  profile:             { type: String },
  weixin:              { type: String },
  qq:                  { type: String },
  weibo:               { type: String },
  avatar:              { type: String },
  githubId:            { type: String },
  githubUsername:      { type: String },
  githubAccessToken:   { type: String },
  isBlock:             { type: Boolean, default: false },
  role:                { type: String, default: CONSTANTS.ROLE_TYPE.Normal },
  score:               { type: Number, default: 0 },
  topic_count:         { type: Number, default: 0 },
  reply_count:         { type: Number, default: 0 },
  follower_count:      { type: Number, default: 0 },
  following_count:     { type: Number, default: 0 },
  collect_tag_count:   { type: Number, default: 0 },
  collect_topic_count: { type: Number, default: 0 },
  create_at:           { type: Date, default: Date.now },
  update_at:           { type: Date, default: Date.now },
  isStar:              { type: Boolean },
  level:               { type: String },
  active:              { type: Boolean, default: false },
  receive_reply_mail:  { type: Boolean, default: false },
  receive_at_mail:     { type: Boolean, default: false },
  from_wp:             { type: Boolean },
  retrieveTime:        { type: Number },
  retrieveKey:         { type: String },
  accessToken:         { type: String },
});

UserSchema.plugin(BaseModel);

UserSchema.methods.isAdmin = function () {
  return this.role === CONSTANTS.ROLE_TYPE.Admin || this.loginname === CONSTANTS.ADMIN_ID;
};

UserSchema.methods.isSupport = function () {
  return this.role === CONSTANTS.ROLE_TYPE.Support;
};

UserSchema.virtual('avatarUrl').get(function () {
  let url = this.avatar || (`https://gravatar.com/avatar/${utility.md5(this.email.toLowerCase())}?size=48`);

  // www.gravatar.com 被墙
  url = url.replace('www.gravatar.com', 'gravatar.com');

  // 让协议自适应 protocol，使用 `//` 开头
  if (url.indexOf('http:') === 0) {
    url = url.slice(5);
  }

  // 如果是 github 的头像，则限制大小
  if (url.indexOf('githubusercontent') !== -1) {
    url += '&s=120';
  }

  return url;
});

UserSchema.virtual('isAdvanced').get(function () {
  // 积分高于 700 则认为是高级用户
  return this.score > 700 || this.is_star;
});

UserSchema.index({ loginname: 1 }, { unique: true });
UserSchema.index({ email: 1 }, { unique: true });
UserSchema.index({ score: -1 });
UserSchema.index({ githubId: 1 });
UserSchema.index({ accessToken: 1 });

mongoose.model('User', UserSchema);
